package ar.edu.utn.frba.disenio;

import org.joda.time.DateTime;
import org.joda.time.Days;
import org.joda.time.Duration;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.uqbar.commons.model.UserException;

import ar.edu.utn.frba.disenio.exceptions.ParseException;

 public class DateParser {
	 
	 private static DateTime parseaEnFormato(String formatoInput, String input) {
		
		if(input == null)
		{
			throw new UserException("Debe ingresar la fecha.");
		}
		DateTimeFormatter formato = DateTimeFormat.forPattern(formatoInput);
		if(input.length() <= 10)
		{
			input = input + " 00:00";
		}
		try 
		{
			return formato.parseDateTime(input).toDateTime();
		}
		catch (RuntimeException e) 
		{
			throw(new ParseException("No se pudo parsear la fecha: "+ input));
		}
	}
 
	 public static DateTime parseaEnISO(String input) {
		
		return parseaEnFormato("yyyy-MM-dd H:m", input);
	 }
	 
	 public static DateTime parseaEnLatino(String input) {
		 
		 return parseaEnFormato("dd/MM/yyyy H:m", input);
	 }
	 
	 public static DateTime parseaEnNorteamericano(String input) {
		
		 return parseaEnFormato("MM-dd-yyyy H:m", input);
	 }
	 
	 public static DateTime parseaFlexiblemente(String input) {
		 
		  try {
			 return parseaEnISO(input);
		  } catch (ParseException  e) {
			  try {
				  return parseaEnLatino(input);
			  } catch (ParseException e1) {
				  try {
					 return parseaEnNorteamericano(input);
				  } catch (ParseException e2) {
					  throw(new ParseException("No se pudo parsear la fecha: " + input));
				  	}
			  	}
		  	}
	 }
	 
	 public static int diasEntre(DateTime fecha1, DateTime fecha2) {
		 
		 return Math.abs(Days.daysBetween(fecha1, fecha2).getDays());
	 }
	 
	 public static Duration duracionEntre(DateTime fecha1, DateTime fecha2) {
		 
		 return new Duration(fecha1, fecha2);
	 }
	 
	 public static boolean esAnterior(DateTime fecha1, DateTime fecha2) {
		 
		 return (fecha1.compareTo(fecha2) == -1);
	 }
	 
	public static boolean fechaEntre(DateTime fecha, DateTime inicio, DateTime fin)
	{
		return fecha.isAfter(inicio) && fecha.isBefore(fin);
	}

}
 
